/*!
 * \file ParserAdapter.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 行情解析器适配器头文件
 * 
 * \details 本文件定义了WonderTrader数据服务系统的行情解析器适配器：
 *          - 提供行情解析器的统一适配接口
 *          - 实现IParserSpi接口，处理行情解析器回调
 *          - 支持多种行情数据类型处理（tick、Level2数据）
 *          - 管理行情解析器的生命周期和配置
 *          - 提供交易所和合约代码过滤功能
 *          - 集成基础数据管理器和数据管理器
 *          - 支持外部行情解析器扩展
 *          - 提供行情解析器管理器功能
 */
#pragma once
#include <set>
#include <vector>
#include <memory>
#include <boost/core/noncopyable.hpp>
#include "../Includes/IParserApi.h"

NS_WTP_BEGIN
class WTSVariant;
NS_WTP_END

USING_NS_WTP;
class wxMainFrame;
class WTSBaseDataMgr;
class DataManager;

/**
 * @class ParserAdapter
 * @brief 行情解析器适配器类
 * 
 * @details ParserAdapter是WonderTrader数据服务系统的行情解析器适配器，负责：
 *          - 实现行情解析器回调接口，处理各种行情数据
 *          - 管理行情解析器的初始化、配置和生命周期
 *          - 处理tick数据、Level2数据（订单队列、订单明细、逐笔成交）
 *          - 提供交易所和合约代码过滤功能
 *          - 集成基础数据管理器进行合约信息管理
 *          - 配合数据管理器进行数据分发和处理
 *          - 支持外部行情解析器的动态加载和扩展
 *          - 提供行情解析器日志处理和错误管理
 *          - 支持符号列表处理和订阅管理
 * 
 * @note 该类是行情数据处理的核心适配器，连接解析器和数据管理器
 * @warning 必须正确配置过滤器和数据管理器才能正常工作
 */
class ParserAdapter : public IParserSpi, private boost::noncopyable
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化行情解析器适配器
	 * @param bgMgr 基础数据管理器
	 * @param dtMgr 数据管理器
	 */
	ParserAdapter(WTSBaseDataMgr * bgMgr, DataManager* dtMgr);
	
	/**
	 * @brief 析构函数
	 * @details 清理资源，释放行情解析器
	 */
	~ParserAdapter();

public:
	/**
	 * @brief 初始化适配器
	 * @details 根据配置参数初始化行情解析器适配器
	 * @param id 适配器标识符
	 * @param cfg 配置参数对象
	 * @return bool 初始化是否成功
	 */
	bool	init(const char* id, WTSVariant* cfg);

	/**
	 * @brief 初始化外部适配器
	 * @details 使用外部行情解析器API初始化适配器
	 * @param id 适配器标识符
	 * @param api 外部行情解析器API
	 * @return bool 初始化是否成功
	 */
	bool	initExt(const char* id, IParserApi* api);

	/**
	 * @brief 释放适配器
	 * @details 释放适配器资源，清理行情解析器
	 */
	void	release();

	/**
	 * @brief 运行适配器
	 * @details 启动行情解析器适配器，开始数据处理
	 * @return bool 启动是否成功
	 */
	bool	run();

	/**
	 * @brief 获取适配器标识符
	 * @details 获取适配器的唯一标识符
	 * @return const char* 适配器标识符
	 */
	const char* id() const { return _id.c_str(); }

public:
	/**
	 * @brief 处理符号列表
	 * @details 处理来自行情解析器的符号列表信息
	 * @param aySymbols 符号数组
	 */
	virtual void handleSymbolList(const WTSArray* aySymbols) override;

	/**
	 * @brief 处理行情数据
	 * @details 处理来自行情解析器的tick行情数据
	 * @param quote 行情数据
	 * @param procFlag 处理标志
	 */
	virtual void handleQuote(WTSTickData *quote, uint32_t procFlag) override;

	/**
	 * @brief 处理订单队列数据
	 * @details 处理来自行情解析器的Level2订单队列数据
	 * @param ordQueData 订单队列数据
	 */
	virtual void handleOrderQueue(WTSOrdQueData* ordQueData) override;

	/**
	 * @brief 处理逐笔成交数据
	 * @details 处理来自行情解析器的Level2逐笔成交数据
	 * @param transData 逐笔成交数据
	 */
	virtual void handleTransaction(WTSTransData* transData) override;

	/**
	 * @brief 处理订单明细数据
	 * @details 处理来自行情解析器的Level2订单明细数据
	 * @param ordDetailData 订单明细数据
	 */
	virtual void handleOrderDetail(WTSOrdDtlData* ordDetailData) override;

	/**
	 * @brief 处理解析器日志
	 * @details 处理来自行情解析器的日志信息
	 * @param ll 日志级别
	 * @param message 日志消息
	 */
	virtual void handleParserLog(WTSLogLevel ll, const char* message) override;

	/**
	 * @brief 获取基础数据管理器
	 * @details 获取基础数据管理器接口
	 * @return IBaseDataMgr* 基础数据管理器指针
	 */
	virtual IBaseDataMgr* getBaseDataMgr() override;

private:
	IParserApi*			_parser_api;	/*< 行情解析器API接口 */
	FuncDeleteParser	_remover;		/*< 解析器删除函数 */
	WTSBaseDataMgr*		_bd_mgr;		/*< 基础数据管理器 */
	DataManager*		_dt_mgr;		/*< 数据管理器 */

	bool				_stopped;		/*< 停止标志 */

	typedef faster_hashset<std::string>	ExchgFilter;	/*< 交易所过滤器类型 */
	ExchgFilter			_exchg_filter;	/*< 交易所过滤器 */
	ExchgFilter			_code_filter;	/*< 合约代码过滤器 */
	WTSVariant*			_cfg;			/*< 配置参数 */
	std::string			_id;			/*< 适配器标识符 */
};

typedef std::shared_ptr<ParserAdapter>	ParserAdapterPtr;						/*< 解析器适配器智能指针类型 */
typedef faster_hashmap<std::string, ParserAdapterPtr>	ParserAdapterMap;		/*< 解析器适配器映射表类型 */

/**
 * @class ParserAdapterMgr
 * @brief 行情解析器适配器管理器类
 * 
 * @details ParserAdapterMgr是WonderTrader数据服务系统的解析器适配器管理器，负责：
 *          - 管理多个行情解析器适配器的生命周期
 *          - 提供适配器的注册、查询和管理功能
 *          - 支持适配器的批量启动和停止
 *          - 维护适配器映射表和状态管理
 *          - 提供适配器数量统计和状态查询
 * 
 * @note 该类采用单例模式管理所有解析器适配器
 * @warning 适配器管理器必须在系统关闭时正确释放所有适配器
 */
class ParserAdapterMgr : private boost::noncopyable
{
public:
	/**
	 * @brief 释放管理器
	 * @details 释放所有适配器资源，清理管理器状态
	 */
	void	release();

	/**
	 * @brief 运行管理器
	 * @details 启动所有适配器，开始数据处理
	 */
	void	run();

	/**
	 * @brief 获取适配器
	 * @details 根据标识符获取指定的适配器
	 * @param id 适配器标识符
	 * @return ParserAdapterPtr 适配器智能指针
	 */
	ParserAdapterPtr getAdapter(const char* id);

	/**
	 * @brief 添加适配器
	 * @details 向管理器添加一个新的适配器
	 * @param id 适配器标识符
	 * @param adapter 适配器智能指针
	 * @return bool 添加是否成功
	 */
	bool	addAdapter(const char* id, ParserAdapterPtr& adapter);

	/**
	 * @brief 获取适配器数量
	 * @details 获取当前管理的适配器数量
	 * @return uint32_t 适配器数量
	 */
	uint32_t size() const { return _adapters.size(); }

public:
	ParserAdapterMap _adapters;	/*< 适配器映射表 */
};


